/*************************************************
  * 描述：cxitreenode私有实现类
  *
  * File：cxitreenode_p.hpp
  * Author：chenyujin@mozihealthcare.cn
  * Date：2025/10/9
  * Update：
  * ************************************************/
#ifndef COREXI_COMMON_PC_CXITREENODE_P_HPP
#define COREXI_COMMON_PC_CXITREENODE_P_HPP

#include <controls/tree/cxitreenode.h>

class CxiTreeNode::CxiTreeNodePrivate
{
public:
	explicit CxiTreeNodePrivate(const CxiTreeNode::Ptr& parent)
		: parent(parent) {};

	void invalidateIndex()
	{
		indexBuilt = false;
		keyIndex.clear();
		textIndex.clear();
	}

	void buildIndex(const CxiTreeNode::Ptr& node)
	{
		if (!node) return;
		keyIndex[node->key()].push_back(node);
		textIndex[node->text()].push_back(node);
		for (auto& child: node->m_pImplNode->children)
		{
			buildIndex(child);
		}
	}

public:
	// 父节点
	std::weak_ptr<CxiTreeNode> parent;
	// 一级子节点列表
	QVector<CxiTreeNode::Ptr> children;
	// 节点key（唯一主键），业务上通过数据库进行填充，不需要treeView自己确保其唯一性
	QString key;
	// 节点展示文本
	QString text;
	// 悬停提示文本
	QString tooltip;
	// 实际数据
	QVariant value;

	// 可编辑
	bool editable = true;
	// 可勾选
	bool checkable = false;
	// 勾选状态
	Qt::CheckState checkState = Qt::Unchecked;
	// 是否显示在下拉框中
	bool showInCombo = false;

	// 维护两个哈希表用于加快查询效率，且仅root节点才会使用
	QHash<QString, std::vector<CxiTreeNode::Ptr>> keyIndex;
	QHash<QString, std::vector<CxiTreeNode::Ptr>> textIndex;
	// 懒加载
	// 当第一次调用 getChildByKey / getChildrenByKey 等方法时，检查 indexBuilt：
	// 如果未构建，则递归整个树生成索引。
	// 如果已构建，直接查找哈希表。
	bool indexBuilt = false;
};

#endif//COREXI_COMMON_PC_CXITREENODE_P_HPP
